package org.hales.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.hales.annotation.ExcelExportColumn;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Excel自定义导出类
 * @author 陈建康
 */

@Data
@AllArgsConstructor
public class ExcelFieldVO {
    public  String exportName = "列表导出"; // 表头名称
    private Integer index;                // 字段导出后索引
    private String fieldName;             // 字段属性名
    private String headName;              // 字段标题

    public ExcelFieldVO(Integer index, String fieldName, String headName) {
        this.index = index;
        this.fieldName = fieldName;
        this.headName = headName;
    }


    /**
     * 解析类中的Excel导出字段
     * 该方法通过反射机制获取类中的字段，并根据注解确定哪些字段需要导出到Excel
     * 它创建一个ExcelFieldVO对象列表，每个对象包含字段的索引、名称和标题
     * 如果类本身带有ExcelExportColumn注解，则使用该注解的exportName作为表头名称
     *
     * @param clazz 要解析的类
     * @return 包含Excel导出字段信息的列表
     */
    public static List<ExcelFieldVO> parseFields(Class<?> clazz) {
        // 创建一个列表，用于存储Excel导出字段信息
        List<ExcelFieldVO> excelFieldVOS = new ArrayList<>();

        // 获取类的所有字段
        Field[] fields = clazz.getDeclaredFields();

        // 遍历每个字段，查找带有ExcelExportColumn注解的字段
        for (Field field : fields) {
            if (field.isAnnotationPresent(ExcelExportColumn.class)) {
                // 获取字段上的ExcelExportColumn注解
                ExcelExportColumn annotationField = field.getAnnotation(ExcelExportColumn.class);

                // 将字段的索引、名称和标题添加到列表中
                excelFieldVOS.add(new ExcelFieldVO(annotationField.index(),field.getName(), annotationField.value()));
            }
        }

        // 检查类本身是否带有ExcelExportColumn注解
        ExcelExportColumn annotationClass = clazz.getAnnotation(ExcelExportColumn.class);
        String name = "";
        if (annotationClass != null) {
            // excel 属性名设置
            name = annotationClass.exportName();
        }

        // excel 导出表头排序
        // 对列表中的字段按索引进行排序
        List<ExcelFieldVO> result = excelFieldVOS.stream().sorted(Comparator.comparingInt(ExcelFieldVO::getIndex)).collect(Collectors.toList());

        // 设置第一个字段的导出名称为类注解中的exportName
        result.get(0).setExportName(name);

        // 返回排序后的字段列表
        return result;
    }


}
